package sample.todo.android;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import sample.todo.android.model.Task;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ListActivity {
	//　データを保存するところ
	public static List<Task> store;
	/**
	 * データを全件取得する
	 * @return
	 */
	private List<Task> findAll() {
		if (store == null) {
			List<Task> list = new ArrayList<Task>();
			store = list;
		}
		// ソート
		// 完了してないもの優先、期限があって、近いもの優先
		Collections.sort(store, new Comparator<Task>() {
			@Override
			public int compare(Task t1, Task t2) {
				if (t1.isDone() == t2.isDone()) {
					if (t1.getDueDate() == t2.getDueDate()) {
						return 0;
					} else if (t1.getDueDate() == null) {
						return 1;
					} else if (t2.getDueDate() == null) {
						return -1;
					} else {
						return t1.getDueDate().compareTo(t2.getDueDate());
					}
				} if (t1.isDone() == false) {
					return -1;
				}
				return 1;
			}
		});
		return store;
	}
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // カスタムアダプタをListViewに設定する
        updateList();

        final Context ctx = this;
        
        // タスクの内容を入力するためのテキストボックス
		final EditText text = (EditText) findViewById(R.id.EditText01);
		
        // タスクを追加するボタン
        final Button buttonAdd = (Button) findViewById(R.id.ButtonAdd);
        buttonAdd.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
		        // データを取得
		        final List<Task> tasks = findAll();
				Toast.makeText(ctx, "追加しました", RESULT_OK).show();
				Task t = new Task(text.getText().toString());
				tasks.add(t);
				
				// 入力欄をクリア
				text.setText("");
				updateList();
			}
		});
    }
    
    /**
     * データを更新する
     */
    private void updateList() {
        final TodoListAdapter adapter =
        	new TodoListAdapter(this, findAll());
        setListAdapter(adapter);
    }
    @Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    	Log.d("", "onActivityResult.......");
    	updateList();
	}

	/**
     * Todoリスト用のカスタムAdapterクラス.
     * このクラスの役割は、データとListViewとを結びつけること。
     * @author hiromi
     */
    class TodoListAdapter extends BaseAdapter {
    	private final LayoutInflater mInflater;
    	private final List<Task> data;
    	
    	/**
    	 * ListViewの1行分のUIコンポーネントを保持するためのクラス
    	 * @author hiromi
    	 */
    	class ViewHolder {
    		CheckBox done;
    		TextView contents;
    		TextView dueDate;
    	}
    	
    	/**
    	 * ListViewに渡すデータを渡しオブジェクトを初期化する
    	 * @param context コンテキスト
    	 * @param data データ
    	 */
    	public TodoListAdapter(final Context context, final List<Task> data) {
    		this.mInflater = LayoutInflater.from(context);
    		this.data = data;
    	}
		@Override
		public int getCount() {
			return data.size();
		}
		@Override
		public Task getItem(int position) {
			return data.get(position);
		}
		@Override
		public long getItemId(int position) {
			return position;
		}
		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			ViewHolder holder;
			if (convertView == null) {
				convertView = mInflater.inflate(R.layout.todo_list, null);
				holder = new ViewHolder();
				
				// 完了(チェックボックス）
				holder.done = (CheckBox) convertView
					.findViewById(R.id.CheckBoxDone);
				// 内容
				holder.contents = (TextView) convertView
			    	.findViewById(R.id.TextContents);
				// 期限
				holder.dueDate = (TextView) convertView
					.findViewById(R.id.TextDueDate);

				final Task t = getItem(position);
				holder.done.setChecked(t.isDone());
				// チェックボックスの値が変更されたとき
				holder.done.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
					@Override
					public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
						t.setDone(isChecked);
						updateList();
					}
				});
				// 内容がクリックされたとき
				holder.contents.setOnClickListener(new View.OnClickListener() {
					@Override
					public void onClick(View v) {
						Intent i = new Intent(v.getContext(), EditActivity.class);
						i.putExtra(EditActivity.EXT_POSITION, position);
						startActivityForResult(i, 0);
						startActivity(i);
						
					}
				});
				
				// 内容,期限を設定
				holder.contents.setText(data.get(position).getContents());
				holder.dueDate.setText(data.get(position).getFormatedDate());
				
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			return convertView;
		}
    }
}